﻿using Drempelvrij.UI.Web.ViewModels;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Xml;
using System.Web.Providers.Entities;
using Drempelvrij.DAL.UnitOfWork;
using Drempelvrij.DAL.Repositories;
using Drempelvrij.Models.Entities;

namespace Drempelvrij.UI.Web.Controllers
{
    public class ParkeerController : Controller
    {
        private readonly IUnitOfWork _uow;
        private readonly IParkeerPlaatsRepository _parkeerPlaatsRepository;

        public ParkeerController(IUnitOfWork uow, IParkeerPlaatsRepository parkeerPlaatsRepository)
        {
            _uow = uow;
            _parkeerPlaatsRepository = parkeerPlaatsRepository;
        }

        public ActionResult Index()
        {
            IList<ParkeerPlaats> parkeerplaatsen = _parkeerPlaatsRepository.FindAll();
            ParkeerPlaatsenViewModel parkeerViewModel = new ParkeerPlaatsenViewModel();
            parkeerViewModel.latLngCoordinates = new string[parkeerplaatsen.Count];
            parkeerViewModel.straten = new string[parkeerplaatsen.Count];
            parkeerViewModel.huisnummers = new string[parkeerplaatsen.Count];
            int count = 0;
  
            foreach (ParkeerPlaats parkeer in parkeerplaatsen)
            {
                parkeerViewModel.latLngCoordinates[count] = parkeer.coordinaat;
                parkeerViewModel.straten[count] = parkeer.straatnaam;
                parkeerViewModel.huisnummers[count] = parkeer.nummer;
                count++;
            }

            return View(parkeerViewModel);
        }

        // Deze methode leest de XML coordinaten, straatnamen en nummers uit en convert ze naar Lat Lng. Voegt ze daarna in de database.
        //public ActionResult Index()
        //{
        //    string[] rijksCoordinaten = GetCoordinatenFromXML();
        //    string[] latLngCoordinaten = new string[rijksCoordinaten.Length];

        //    for (int i = 0; i < rijksCoordinaten.Length; i++)
        //    {
        //        // split de coordinaten string in twee strings (x, y)
        //        // daarna vervangen we de . door , zodat met converten deze correct blijft.
        //        string[] xy = rijksCoordinaten[i].Split(',');
        //        xy[0] = xy[0].Replace('.', ',');
        //        xy[1] = xy[1].Replace('.', ',');

        //        double x = Convert.ToDouble(xy[0]);
        //        double y = Convert.ToDouble(xy[1]);

        //        double[] resultaat = convertRijksToLatLng(x, y);

        //        double lat = Math.Round(resultaat[0], 5);
        //        double lng = Math.Round(resultaat[1], 5);

        //        // weer de komma met punt replacen anders krijg je verkeerde latlong waardes
        //        latLngCoordinaten[i] = lat.ToString().Replace(',', '.') + "," + lng.ToString().Replace(',', '.');
        //    }

        //    ParkeerPlaatsenViewModel parkeerViewModel = new ParkeerPlaatsenViewModel();
        //    parkeerViewModel.latLngCoordinates = latLngCoordinaten;

        //    string[] nummers = GetNummerFromXML();
        //    string[] straatNamen = GetStraatNaamFromXML();

        //    int count = 0;
        //    foreach (string coordinaat in parkeerViewModel.latLngCoordinates)
        //    {
        //        ParkeerPlaats parkeerPlaats = new ParkeerPlaats();
        //        parkeerPlaats.coordinaat = coordinaat;
        //        parkeerPlaats.nummer = nummers[count];
        //        parkeerPlaats.straatnaam = straatNamen[count]; 
        //        _parkeerPlaatsRepository.Add(parkeerPlaats);
        //        count++;
        //    }


        //    return View(parkeerViewModel);
        //}


        //public double[] convertRijksToLatLng(double x, double y)
        //{
        //    double dX = (x - 155000) * Math.Pow(10, -5);
        //    double dY = (y - 463000) * Math.Pow(10, -5);

        //    double somN = (3235.65389 * dY) + (-32.58297 * Math.Pow(dX, 2)) + (-0.2475 *
        //        Math.Pow(dY, 2)) + (-0.84978 * Math.Pow(dX, 2) *
        //        dY) + (-0.0655 * Math.Pow(dY, 3)) + (-0.01709 *
        //        Math.Pow(dX, 2) * Math.Pow(dY, 2)) + (-0.00738 *
        //        dX) + (0.0053 * Math.Pow(dX, 4)) + (-0.00039 *
        //        Math.Pow(dX, 2) * Math.Pow(dY, 3)) + (0.00033 * Math.Pow(
        //        dX, 4) * dY) + (-0.00012 *
        //        dX * dY);

        //    double somE = (5260.52916 * dX) + (105.94684 * dX * dY) + (2.45656 *
        //         dX * Math.Pow(dY, 2)) + (-0.81885 * Math.Pow(
        //            dX, 3)) + (0.05594 *
        //         dX * Math.Pow(dY, 3)) + (-0.05607 * Math.Pow(
        //            dX, 3) * dY) + (0.01199 *
        //         dY) + (-0.00256 * Math.Pow(dX, 3) * Math.Pow(
        //            dY, 2)) + (0.00128 *
        //         dX * Math.Pow(dY, 4)) + (0.00022 * Math.Pow(dY,
        //            2)) + (-0.00022 * Math.Pow(
        //            dX, 2)) + (0.00026 *
        //         Math.Pow(dX, 5));

        //    double latitude = 52.15517 + (somN / 3600);
        //    double longitude = 5.387206 + (somE / 3600);

        //    double[] array = new double[2];
        //    array[0] = latitude;
        //    array[1] = longitude;

        //    return array;
        //}

        // als er een nieuwe XML komt met andere parkeerplaatsen kan deze methode worden gebruikt
        // om de coordinaten uit de XML te lezen.
        //public string[] GetCoordinatenFromXML()
        //{
        //    XmlDocument xmlDoc = new XmlDocument();

        //    // de map.xml moet in c:/ staan, kreeg hem niet werkend anders.
        //    xmlDoc.Load("/map.xml");

        //    var xmlNameSpace = new XmlNamespaceManager(xmlDoc.NameTable);
        //    xmlNameSpace.AddNamespace("xsl", "http://www.w3.org/1999/XSL/Transform");

        //    XmlNodeList userNodes = xmlDoc.SelectNodes("//featureMember/sdo_rdam/GEOM/Point/coordinates", xmlNameSpace);

        //    string[] arrayCoordinaten = new string[userNodes.Count];
        //    int count = 0;

        //    foreach (XmlNode node in userNodes)
        //    {
        //        arrayCoordinaten[count] = node.InnerText.ToString();
        //        count++;
        //    }

        //    return arrayCoordinaten;
        //}

        //public string[] GetStraatNaamFromXML()
        //{
        //    XmlDocument xmlDoc = new XmlDocument();

        //    // de map.xml moet in c:/ staan, kreeg hem niet werkend anders.
        //    xmlDoc.Load("/map.xml");

        //    var xmlNameSpace = new XmlNamespaceManager(xmlDoc.NameTable);
        //    xmlNameSpace.AddNamespace("xsl", "http://www.w3.org/1999/XSL/Transform");

        //    XmlNodeList straatNaam = xmlDoc.SelectNodes("//featureMember/sdo_rdam/OMSCHRIJVING", xmlNameSpace);

        //    string[] arrayStraatNamen = new string[straatNaam.Count];

        //    int count = 0;
        //    foreach (XmlNode node in straatNaam)
        //    {
        //        arrayStraatNamen[count] = node.InnerText.ToString();
        //        count++;
        //    }
        //    return arrayStraatNamen;
        //}

        //public string[] GetNummerFromXML()
        //{
        //    XmlDocument xmlDoc = new XmlDocument();

        //    // de map.xml moet in c:/ staan, kreeg hem niet werkend anders.
        //    xmlDoc.Load("/map.xml");

        //    var xmlNameSpace = new XmlNamespaceManager(xmlDoc.NameTable);
        //    xmlNameSpace.AddNamespace("xsl", "http://www.w3.org/1999/XSL/Transform");

        //    XmlNodeList huisNummer = xmlDoc.SelectNodes("//featureMember/sdo_rdam/HUISNUMMER", xmlNameSpace);

        //    string[] arrayNummers = new string[huisNummer.Count];

        //    int count = 0;
        //    foreach (XmlNode node in huisNummer)
        //    {
        //        arrayNummers[count] = node.InnerText.ToString();
        //        count++;
        //    }
        //    return arrayNummers;
        //}
    }
}